package com.atguigu.LinkedList;

public class Josepfu {
    public static void main(String[] args) {
        CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
        circleSingleLinkedList.add(500);
        circleSingleLinkedList.showBoy();
        circleSingleLinkedList.countBoy(10,20,500);



    }
}
//创建一个环形单向链表
class CircleSingleLinkedList{
    //创建一个first节点，当前没有编号,到时候指向第一个节点
    private Boy first=null;
    //出圈问题
    /*
    * startNum:从第几个小孩子开始
    * countNUm：数几个数出圈
    * nums一共几个小孩子
    *
    * */
    public void countBoy(int startNum,int countNum,int nums){
        if(first==null||startNum<1||startNum>nums){
            System.out.println("输入参数有误，请重新输入");
            return;
        }
        //设置一个辅助节点，帮助我们遍历
        Boy hepler=first;
        //让helper节点指向最后一个节点
        while (true){
            if(hepler.getNext()==first){
                break;
            }
            hepler=hepler.getNext();
        }
        //使first指向最先开始数数的节点,helper指向前一个节点
        for (int i = 0; i < startNum-1; i++) {
            first=first.getNext();
            hepler=hepler.getNext();
        }
        while (true){
            if(first==hepler){
                //表示就剩下一个节点
                break;
            }
            //进行计数，也就是first移动countNum-1个位置，让first指向的节点输出
            for (int i = 0; i < countNum-1; i++) {
                first=first.getNext();
                hepler=hepler.getNext();
            }
            System.out.printf("出圈的节点为%d\n",first.getNo());
            //first指向下一个节点，helper指向first节点
            first=first.getNext();
            hepler.setNext(first);
        }
        System.out.printf("留在圈内的节点为%d\n",first.getNo());


    }



    public void add(int nums){
       if(nums<1){
           System.out.println("输入的数字不敌");
           return;
       }
        //创建一个辅助节点，指向最新的节点
        Boy curBoy=null;
        for (int i = 1; i <=nums; i++) {
            Boy boy=new Boy(i);
            if(i==1){
                //使first指向第一个节点
                first=boy;
                first.setNext(first);//构成环
                curBoy=first;
            }else{
                //当前节点指向新添加的节点
                curBoy.setNext(boy);
                //新添加的节点指向fist，构成环
                boy.setNext(first);
                //辅助节点指向最近的节点
                curBoy=boy;

            }
        }
    }
    //遍历当前链表
    public void showBoy(){
        //判断当前链表是否为空
        if (first==null){
            System.out.println("链表为空");
            return;
        }
        //因为first不能动，因此我们使用一个辅助指针完成遍历
        Boy curBoy=first;
        while (true){
            System.out.printf("小孩子的编号为%d\n",curBoy.getNo());
            if(curBoy.getNext()==first){
                break;
            }
            curBoy=curBoy.getNext();//curBoy后移动
        }
    }
}

//创建一个boy类，表示一个节点
class Boy{
    private int no;
    private Boy next;
    public Boy(int no){
        this.no=no;
    }

    public int getNo() {
        return no;
    }
    public void setNo(int no) {
        this.no = no;
    }

    public void setNext(Boy next) {
        this.next = next;
    }

    public Boy getNext() {
        return next;
    }
}
